package list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

public class QueueAPI {
    /**
     * Collection集合下   子集和【叫列队】  包位置：Java.util
     * Queue  列队   单端队列
     * Deque 队列  上端队列   Deque接口--继承--Queue接口
     * 作用：保存数据，有序储存和处理，功能：数据缓冲或者多线程协调工作
     *
     * 队列实现类：
     * LinkedList：双向链表
     */
    public  void  testQueue(){
        //创建队列--多态--LinkedList
        Queue<String> q=new LinkedList<>();
        /**
         * offer()----add()一样
         * 作用：入队操作，队尾追加元素
         */
        q.offer("喜喜");q.offer("哈哈");q.offer("呵呵");
        System.out.println("q队列"+q);
        /**
         * poll()
         * 作用：出队操作，获取队首元素，并且删除队列中队首
         * peek()
         * 作用：出队操作，获取队首元素，不删除队列中队首
         */
        q.poll();//删除队首元素
        System.out.println("q队列"+q);
        String  str=q.peek();
        System.out.println("q队列"+str);
        System.out.println("q队列"+q);
        /**
         * 需求：1.遍历队列---while---只遍历一次队列【队列元素消失】
         * 提示：while 条件  ？  拿到队列中总长度size（）>0
         * 需求2：遍历队列---增强for--队列元素不消失
         * 提示：for 条件：E  e数组泛型/集合泛型：数组引用/集合引用
         */

while(q.size()>0){//true:队列总数>0  队列又元素  遍历
    str=q.poll();//获取队首  删除队首
    System.out.println("队列元素"+str);

}
        System.out.println(q);
for (String s:q){
    String a=q.peek();
    System.out.println("打印队列元素"+s);
}
        System.out.println("q"+q);
    }
    //Deque 队列  双端队列  --继承---单端队列
    @Test
            public   void  testDeque(){

        //Deque  队列   双端队列    方法基本一致，部分方法不一致
        Deque<String> d=new LinkedList<>();
        d.offer("喜喜");d.offer("哈哈");d.offer("哈哈");
        System.out.println("双端队列"+d);
        //offerFirst（） 队首添加元素  offerLast（） 队尾添加元素
        d.offerFirst("你好");
        d.offerLast("我好");
        System.out.println("结果集合"+d);
        //getFirst()获取队首 getLast()获取队尾【单端：peek类似】
        //poolFirst() 获取队首，删除队列中队首【单端：pool】
        //poolLast（）获取队尾  删除队列中队尾
        String  c=d.pollFirst();
        System.out.println("队首元素"+c);
        System.out.println("双端队列"+d);
    }
    /**
     * 栈结构：业务如果有后退【撤销】情况使用
     * 双端队列支持栈结构--提供相应的方法实现栈结构
     */
    @Test
    public  void   testStack(){
        //创建双端队列--支持栈结构
        Deque<String>  c=new LinkedList<>();
        /**
         * push()Deque 独有方法--支持栈结构
         * ---offerQueue---add：Collection接口  添加
         * 作用：【添加：往栈压入一个元素】  压栈操作
         */
        c.push("你好");c.push("我好");c.push("大家好");
        System.out.println("栈结构"+c);
        /**
         * pop()出栈一个尾元素  --pollLast类似【拿先入后出，最后一个压栈元素】
         */
        String Last=c.pop();
        System.out.println("出栈尾元素"+Last);
        System.out.println("栈结构"+c);
        /**
         * 需求1：遍历栈结构--while--元素出栈，队列元素需求清空
         * 需求2：遍历栈结构---增强for--元素遍历成功，队列元素不变
         */

        //作业：
        /**
         * pop  poll  peek的使用区别
         * pop是位于栈结构中的方法  作用是出栈一个为元素  并且会在栈结构中删除出栈元素
         * poll是位于Queue中的方法，作用是出列队首元素并且删除队首元素
         * peek是位于Queue中的方法，作用是出列队首元素但是不删除此队首元素
         * 三个都是添加元素的意思，但添加方式不同
         */
        while(c.size()>0);{
            String s=c.pop();
            System.out.println(s);
        }
        System.out.println(c);
        Deque<String>  c2=new LinkedList<>();
        c2.push("喜喜");c2.push("哈哈");c2.push("呵呵");
        for (String str:c2){
            System.out.println(str);
        }








    }


    }
